﻿#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
/*深入理解指针4*/

/*
* 回调函数就是⼀个通过函数指针调⽤的函数。
如果你把函数的指针（地址）作为参数传递给另⼀个函数，当这个指针被⽤来调⽤其所指向的函数
时，被调⽤的函数就是回调函数。回调函数不是由该函数的实现⽅直接调⽤，⽽是在特定的事件或条
件发⽣时由另外的⼀⽅调⽤的，⽤于对该事件或条件进⾏响应
*/
//qsort函数的使用需要自行实现一个对两个数进行对比大小的函数
/*
* compar: 比较函数的指针，该函数用于比较两个元素。比较函数应当返回一个整数，表示比较结果：
小于零：表示第一个元素小于第二个元素。
等于零：表示两个元素相等。
大于零：表示第一个元素大于第二个元素。
*/
//int compar(const void* number1, const void* number2)
//{
//	return *(int*)number1 - *(int*)number2;
//}
//
//
//int main()
//{
//	int array[] = {	1,4,5,6,7,8,
//					9,5,4,8,6,45,
//					789,2,65,88,74,55};
//
//	qsort(array, sizeof(array) / sizeof(array[0]), sizeof(array[0]), compar);
//	int count = 0;
//	for (int i = 0; i < sizeof(array) / sizeof(array[0]); i++)
//	{
//
//		printf("%d\t", array[i]);
//		count++;
//		if (count % 6 == 0)
//		{
//			printf("\n");
//		}
//	}
//	return 0;
//}
//qsort函数不仅可以对整型数据排序而且还可以对结构体类型的数据排序。
// //实际的做法可以参考下文
//struct Stu
//{
//	char name[20];
//	int age;
//};
//
//
//int compar(const void* number1, const void* number2)
//{
//	return ((struct Stu*)number1)->age - ((struct Stu*)number2)->age;
//}
//
//
//int main()
//{
//	struct Stu s[] = { {"xiaoming",18}, {.name="lihua",.age=16},{"xiaohong",21} };
//
//	qsort(s, sizeof(s) / sizeof(s[0]), sizeof(s[0]), compar);
//
//	for (int i = 0; i < sizeof(s) / sizeof(s[0]); i++)
//	{
//
//		printf("%s\tage=%d\n", s[i].name,s[i].age);
//
//	}
//	return 0;
//}

//使用冒泡排序模拟QSORT	

int compar(const void* number1, const void* number2)
{
	return *(int*)number1 - *(int*)number2;
}
//交换两个变量的数据，由于变量类型未知所以转换为字符型指针一部分一部分移动
void _swap(const void* number1, const void* number2, size_t size)
{
	for (int i = 0; i < size; i++)
	{
		char temp = *((char*)number1 + i);
		*((char*)number1 + i)= *((char*)number2 + i);
		*((char*)number2 + i)= temp;
	}

}
void m_qsort(void* base, size_t count, size_t size, int (*cmp)(const void*, const void*))
{
	int i = 0, j = 0;
	for (i = 0; i < count - 1; i++)
	{
		for (j = 0; j < count - i - 1; j++)
		{
			if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)
			{
				_swap((char*)base + j * size, (char*)base + (j + 1) * size,
					size);
			}
		}
	}
}
int main()
{
	int array[] = {	1,4,5,6,7,8,
					9,5,4,8,6,45,
					789,2,65,88,74,55};

	m_qsort(array, sizeof(array) / sizeof(array[0]), sizeof(array[0]), compar);
	int count = 0;
	for (int i = 0; i < sizeof(array) / sizeof(array[0]); i++)
	{

		printf("%d\t", array[i]);
		count++;
		if (count % 6 == 0)
		{
			printf("\n");
		}
	}
	return 0;
}